import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;

public class zmd {

	public static void main(String[] args) {
		// 校验参数合法性
		File mdFile = checkArgs(args); // 返回参数对应md文件
		// md文件全名
		String mdFullName = mdFile.getName();

		// 创建md文件的硬连接
		createMdLink(mdFile, mdFullName);
		// 创建1.bat，该bat中包含创建md图片目录的Junction的语句
		createImageBat(mdFile, mdFullName);
	}

	/**
	 创建1.bat，该bat中包含创建md图片目录的Junction的语句

	 Java语言中，createSymbolicLink()只能创建符号链接(mklink /D)，不能创建目录连接点Junction(mklink /J)
	 导致md文件能在本地访问图片，但无法通过上传Git。
	 现改为输出Junction创建语句到1.bat中。
	 */
	private static void createImageBat(File mdFile, String mdFullName) {
		// md文件简名（不带扩展名）
		String mdSimpleName = mdFullName.split("\\.")[0];
		// md所在目录
		File mdParentDirPath = mdFile.getParentFile().getAbsoluteFile();
		// 构造link软连接的目录名
		String mdImageDirName = "." + mdSimpleName + ".assets";

		// 构造link软连接目录的Path
		String lkImageDirAbsPath = new File(mdImageDirName).getAbsolutePath();
		// 构造md文件对应图片目录名
		String mdImageDirPath = new File(mdParentDirPath, mdImageDirName).getAbsolutePath();

		// 创建md图片目录的Junction的语句
		String junc = "mklink /J " + lkImageDirAbsPath + " " + mdImageDirPath;
		// mklink /J D:\demo_dest\.Readme.assets D:\demo_origin\.Readme.assets

		// 将junc输出到当前目录下的1.bat中，运行bat后自删除
		try {
			// 创建batFile文件
			File batFile = new File("1.bat");
			BufferedWriter bw = new BufferedWriter(new FileWriter(batFile, false));
			// 写入Junction语句
			bw.write(junc);
			bw.flush();
			bw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 创建md文件的硬连接
	 */
	private static void createMdLink(File mdFile, String mdFullName) {
		// 得到md文件的path
		String mdAbsPath = mdFile.getAbsolutePath();
		// 得到link硬连接的path
		String lkAbsPath = new File(mdFullName).getAbsolutePath();

		try {
			// 创建md硬连接
			Files.createLink(
					FileSystems.getDefault().getPath(lkAbsPath),
					FileSystems.getDefault().getPath(mdAbsPath));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 校验args
	 */
	private static File checkArgs(String[] args) throws IllegalArgumentException {
		if (args == null || args.length != 1) {
			throw new IllegalArgumentException("请输入合法的 Markdown 文件全路径！");
		}
		File mdFile = new File(args[0]); // 以参数创建File
		if (!mdFile.exists()) {
			throw new IllegalArgumentException("请输入合法的 Markdown 文件全路径！");
		}
		if (!mdFile.getName().endsWith(".md")) {
			throw new IllegalArgumentException("只能操作 Markdown 文件！");
		}
		// 获取当前目录
		File currentFile = new File("");
		if (currentFile.getAbsolutePath().equals(mdFile.getAbsoluteFile().getParent())) {
			throw new IllegalArgumentException("不能操作当前目录下的 Markdown 文件！");
		}
		return mdFile;
	}

}
